package controllers;

import play.*;
import play.mvc.*;

import java.sql.SQLException;
import java.util.*;

import controllers.Secure.Security;

import models.*;
import models.dados.ChaveRepetidaException;
import models.dados.DadoNaoEncontradoException;
import models.Endereco;

public class Application extends Controller {

	public static InterfaceServicosCliente servicos = ServicosCliente
			.getInstancia();

	public static models.Cliente cliente;

	public static void index() {
		render();
	}

	public static void inicial() {
		String cl = Security.connected();
		List<Produto> donuts = null;
		try {
			donuts = servicos.listarDonuts();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Pedido pedido = servicos.getPedidoAtual();
		List<ItemPedido> itens = servicos.getPedidoAtual().getItens();
		String valorCompra = String.format("R$ %.2f", pedido.getValorTotal());
		Date d = new Date(System.currentTimeMillis());
		Calendar c = new GregorianCalendar();

		render(cl, donuts, itens, valorCompra);

	}

	public static void cadastro_cliente() {
		
		render();
	}
	
	public static void feedBack_cadastro_cliente(String msg){
		String mensagem = msg;
		render(mensagem);
	}
	
	public static void feedBack_envio_pedido(long l,String msg){
		long numero = l;
		String mensagem = msg;
		render(numero,mensagem);
	}

	public static void cadastrarCliente(String nome, String rua, int numero,
			String bairro, String complemento, String cep, String telefone,
			String email, String nomeUsuario, String senha) {
		try {
			servicos.cadastrarCliente(nome, rua, numero, bairro, complemento,
					cep, telefone, email, nomeUsuario, senha);
		} catch (ChaveRepetidaException e) {
			
		}
		
		Application.feedBack_cadastro_cliente("Cadastro efetuado com sucesso!");
	}

	public static void donuts() {

		List<Produto> donuts = null;
		try {
			donuts = servicos.listarDonuts();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		Pedido pedido = servicos.getPedidoAtual();
		List<ItemPedido> itens = servicos.getPedidoAtual().getItens();
		String valorCompra = String.format("R$ %.2f", pedido.getValorTotal());
		Date d = new Date(System.currentTimeMillis());
		Calendar c = new GregorianCalendar();
		render(donuts);
	}

	public static void sobre() {
		render();
	}

	public static void contato() {
		render();
	}

	public static void paginaLogin() {
		render();
	}

	public static void login(String usuario, String senha) {
		// Falta implementar

	}

	public static void carrinho() {
		List<ItemPedido> pedidos = servicos.getPedidoAtual().getItens();
		render(pedidos);
	}

	public static void adicionarDonutCarrinho(String sabor, int quantidade) {
		List<Produto> donuts = null;
		try {
			donuts = servicos.listarDonuts();
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		for (int i = 0; i < donuts.size(); i++) {
			if (donuts.get(i).getNome().equals(sabor)) {
				servicos.adicionarProduto(donuts.get(i), quantidade);
				break;
			}

		}
		Application.donuts();

	}

	public static void esvaziarCarrinho() {
		servicos.getPedidoAtual().removerProdutos();
		Application.inicial();
	}

	public static void confirmacao_compra() {
		String cl = Security.connected();
		Pedido pedido = servicos.getPedidoAtual();
		double valor = pedido.getValorTotal();
		List<ItemPedido> itens = pedido.getItens();
		render(itens, valor, cl);

	}
	
	public static void detalhes_pedido(long numero){
		try {
			
			Pedido pedido = servicos.getPedido(numero);
			List<ItemPedido> itens = pedido.getItens();
			Cliente cliente = pedido.getCliente();
			System.out.println(cliente.getNome());
			GregorianCalendar dPedido = (GregorianCalendar) pedido.getDataPedido();
			GregorianCalendar dAlteracao = (GregorianCalendar) pedido.getDataUltimaAlteracao();
			String dataPedido = String.format("%d/%d/%d",dPedido.get(Calendar.DAY_OF_MONTH),
					dPedido.get(Calendar.MONTH)+1, dPedido.get(Calendar.YEAR));
			if(!(dAlteracao==null)){
			String dataUltimaAlteracao = String.format("%d/%d/%d",dAlteracao.get(Calendar.DAY_OF_MONTH),
					dAlteracao.get(Calendar.MONTH), dAlteracao.get(Calendar.YEAR));
			render(cliente,pedido,itens,dataPedido,dataUltimaAlteracao);
			}else{
				
				render(cliente,pedido,itens,dataPedido);
			}

			
			
		} catch (DadoNaoEncontradoException e) {
			
		}
		render();
	}
	
	public static void cancelarPedido(int id){
		try {
			servicos.cancelarPedido(id, Security.connected());
		} catch (DadoNaoEncontradoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AcessoNegadoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (UsuarioBloqueadoException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		PaginasClienteCadastrado.pagina_cliente();
	
	}

	public static void finalizarPedido(String nomeUsuario, String nome,
			String telefone, String rua, int numero, String bairro,
			String complemento, String cep, String email) {
		
		if(Security.isConnected()){
			try {
				servicos.finalizarPedido(Security.connected());
				
				String mensagem = "Pedido enviado";
				long n = servicos.getPedidoAtual().getNumero();
				Application.feedBack_envio_pedido(n,mensagem);
			} catch (DadoNaoEncontradoException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}else{
			try {
				servicos.finalizarPedido(nome, rua, numero, bairro, complemento, cep, email,telefone);
				String mensagem = "Pedido enviado";
				Application.feedBack_envio_pedido(servicos.getPedidoAtual().getNumero(),mensagem);
			} catch (ChaveRepetidaException e) {
				
				e.printStackTrace();
			} catch (DadoNaoEncontradoException e) {
				
			}
		}
        

	}

	public static void detalhes_produto(String nome) {
		try {
			Produto produto = servicos.pesquisarProduto(nome);
			String sabor = produto.getNome();
			String imagem = produto.getUrlImagem();
			String preco = String.format("R$ %.2f", produto.getPreco());
			int quantidade = 0;
			Pedido p = servicos.getPedidoAtual();
			if (p.getItem(sabor) != null) {
				quantidade = p.getItem(sabor).getQuantidade();
			}
			GregorianCalendar data = (GregorianCalendar) produto
					.getDataCadastro();
			String dataCadastro = formatarData(data);
			String cadastradoPor = produto.getCadastradoPor();
			render(sabor, imagem, preco, quantidade, dataCadastro,
					cadastradoPor);

		} catch (DadoNaoEncontradoException e) {

		}
	}

	public static void descricao_donut(Donut donut) {

	}

	private static String formatarData(GregorianCalendar data) {
		String dataCadastro = String.format("%d/%d/%d as %d:%d",
				data.get(Calendar.DAY_OF_MONTH), data.get(Calendar.MONTH),
				data.get(Calendar.YEAR), data.get(Calendar.HOUR_OF_DAY),
				data.get(Calendar.MINUTE));
		return dataCadastro;
	}

}